{ "err_no": 0, "err_msg": "success", "data": { "booklet": { "booklet_id": "6946117847848321055", "base_info": { "id": 0, "booklet_id": "6946117847848321055", "title": "Babel 插件通关秘籍", "price": 3990, "category_id": "6809637767543259144", "status": 1, "user_id": "2788017216685118", "verify_status": 4, "summary": "深入探究 babel 编译原理,学完可以写任何 babel 插件。我们会进行大量的实战,最后还会手写一个简易的 babel。", "cover_img": "https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1646d797b8c34de6b4d323657f430635~tplv-k3u1fbpfcp-watermark.image", "section_count": 34, "section_ids": "6946582409638838308|6956174385904353288|6946578914382708770|6946582409664004133|6946578914764390434|6945997926376144899|6947682728200372232|6947689001713139720|6947678220401508392|6982846603283398687|6946582521672892456|6947733921123532814|6954550974698651680|6947175741821812768|7093335532888915982|6978397048307466252|6966211099620278272|6951617082454704162|6951617020198813733|6947733961896362025|6947735050972561415|6947734309755158559|6951616852606844966|6965661918937743371|6965724651297177640|6982591235101818880|6951616445134405669|6994379397419499523|6995151247120531493|6995460468261257246|6994995289954189327|6994379397591466017|6995834908002222117|6995835006530617381|6947682728250736676", "is_finished": 1, "ctime": 1618158571, "mtime": 1655952478, "put_on_time": 1621854938, "pull_off_time": 1621836018, "finished_time": -62135596800, "recycle_bin_time": -62135596800, "verify_time": -62135596800, "submit_time": 1655952478, "top_time": 1645760339, "wechat_group_img": "https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3905dba20c8a41ddb889c501f754f6b7~tplv-k3u1fbpfcp-watermark.image?", "wechat_group_desc": "", "wechat_group_signal": "babel", "read_time": 33482, "buy_count": 4149, "course_type": 1, "background_img": "https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ab20cfd6ea2042049a580fdd136352fc~tplv-k3u1fbpfcp-watermark.image?", "is_distribution": 1, "distribution_img": "https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/07d0989578004cefb7cb61d9317272aa~tplv-k3u1fbpfcp-zoom-1.image?", "commission": 798, "can_vip_borrow": true, "is_sign": false }, "reading_progress": { "id": 0, "booklet_id": "6946117847848321055", "user_id": "3210229681503629", "status": 1, "buy_type": 1, "reading_end": 0, "reading_progress": 1, "last_section_id": "6956174385904353288", "has_update": 1, "last_rtime": 1658224968, "ctime": 1621995561, "mtime": 1658224937, "valid_begin_time": 0, "valid_end_time": 0, "borrow_times": 0 }, "user_info": { "user_id": "2788017216685118", "user_name": "zxg_神说要有光", "company": "", "job_title": "公号「神光的编程秘籍」", "avatar_large": "https://p9-passport.byteacctimg.com/img/user-avatar/4e9e751e2b32fb8afbbf559a296ccbf2~300x300.image", "level": 6, "description": "小册《typescript 类型体操通关秘籍》已上线", "followee_count": 202, "follower_count": 6685, "post_article_count": 184, "digg_article_count": 450, "got_digg_count": 14568, "got_view_count": 934054, "post_shortmsg_count": 68, "digg_shortmsg_count": 31, "isfollowed": false, "favorable_author": 1, "power": 23908, "study_point": 0, "university": { "university_id": "0", "name": "", "logo": "" }, "major": { "major_id": "0", "parent_id": "0", "name": "" }, "student_status": 0, "select_event_count": 0, "select_online_course_count": 0, "identity": 0, "is_select_annual": true, "select_annual_rank": 0, "annual_list_type": 0, "extraMap": {}, "is_logout": 0, "annual_info": [], "account_amount": 0, "user_growth_info": { "user_id": 2788017216685118, "jpower": 0, "jscore": 494.4, "jpower_level": 0, "jscore_level": 4, "jscore_title": "进阶掘友", "author_achievement_list": [], "vip_level": 0, "vip_title": "" }, "is_vip": false }, "event_discount": null, "is_buy": true, "section_updated_count": 34, "is_new": false }, "introduction": { "id": 83928, "section_id": "6946582409638838308", "title": "小册介绍", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "

作者介绍

\n

某一线大厂某架构组前端工程师,公众号[神光的编程秘籍],维护公司的 builder 和 ide,对编译原理、前端工程化有一定的研究。

\n

小册介绍

\n

实战案例源码

\n

babel 已经是前端领域的必备工具了,它可以让我们使用一些新的语法和 api,babel 会在编译的过程中转为目标环境的支持的语法并引入 polyfill。除此以外,babel 也提供了强大的插件机制,我们可以通过它暴露出的 api 来开发各种代码转换插件。

\n

babel 是一种源码到源码的转换编译器,学习 babel 的原理的过程也会学到编译原理的一些知识。

\n

除了作为转译工具外,babel 也经常用来做静态分析,分析代码,提取信息,然后用于生成文档、lint、type check 等,我们会用大量的实战案例,让你真正能够把 babel 的静态分析能力用起来。

\n

实战部分包括:

\n

自动国际化:自动完成代码的国际化,帮大家扩展下思路,你会发现 babel 原来还可以用来做一些对业务有意义的自动化的事情。

\n

自动生成文档:自动生成 api 文档,不再需要手动去维护。

\n

自动埋点:自动进行函数插桩,埋点是一种常见的函数插桩。

\n

linter: 探索 eslint、stylelint 等 lint 工具的实现原理,能够手写各种检查插件。

\n

type checker:实现简单的 ts 类型检查,会对 typescript 的类型检查的原理会有更深的理解。

\n

压缩混淆:前端必用工具之一,探索它的实现原理,压缩怎么做,混淆怎么做,怎么用 babel 实现,开阔下思路。

\n

js 解释器: AST 除了转译、静态分析外,还可以直接解释执行,学完这个案例可以知道解释器是怎么解释代码的。

\n

模块遍历器:基于 babel 做模块的遍历,理解打包工具的依赖图构建原理。

\n

手写 babel: 手写 babel 是为了加深对 babel 的理解,真正掌握 babel。

\n

小册分为 babel 插件基础、babel 插件进阶、babel 插件实战、手写简易的 babel 四部分内容:

\n

\"\"

\n

你会学到什么?

\n\n

适宜人群

\n\n

购买须知

\n
    \n
  1. 本小册为图文形式内容服务,共计 33 节;
  2. \n
  3. 全部文章已更新完成;
  4. \n
  5. 购买用户可享有小册永久的阅读权限;
  6. \n
  7. 购买用户可进入小册微信群,与作者互动;
  8. \n
  9. 掘金小册为虚拟内容服务,一经购买成功概不退款;
  10. \n
  11. 掘金小册版权归北京北比信息技术有限公司所有,任何机构、媒体、网站或个人未经本网协议授权不得转载、链接、转贴或以其他方式复制发布/发表,违者将依法追究责任;
  12. \n
  13. 在掘金小册阅读过程中,如有任何问题,请邮件联系 xiaoce@xitu.io
  14. \n
", "draft_content": "", "draft_title": "小册介绍", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 180, "read_count": 0, "comment_count": 0, "ctime": 1617377254, "mtime": 1617377254, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, "sections": [ { "id": 84131, "section_id": "6956174385904353288", "title": "Babel 的介绍", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "Babel 的介绍", "markdown_content": "", "markdown_show": "", "is_free": 1, "read_time": 155, "read_count": 23278, "comment_count": 74, "ctime": 1619809164, "mtime": 1619809164, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": { "id": 0, "booklet_id": "6946117847848321055", "user_id": "3210229681503629", "section_id": "6956174385904353288", "reading_end": 0, "reading_progress": 37, "reading_position": 37, "has_update": 1, "last_rtime": 1658224968, "ctime": 1658224171, "mtime": 1658224493 } }, { "id": 83930, "section_id": "6946578914382708770", "title": "Babel 的编译流程", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "Babel 的编译流程", "markdown_content": "", "markdown_show": "", "is_free": 1, "read_time": 253, "read_count": 18941, "comment_count": 52, "ctime": 1617377280, "mtime": 1617377280, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 83929, "section_id": "6946582409664004133", "title": "Babel 的 AST", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "Babel 的 AST", "markdown_content": "", "markdown_show": "", "is_free": 1, "read_time": 1120, "read_count": 21676, "comment_count": 62, "ctime": 1617377254, "mtime": 1617377254, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 83931, "section_id": "6946578914764390434", "title": "Babel 的 API", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "Babel 的 API", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 1403, "read_count": 19165, "comment_count": 64, "ctime": 1617462141, "mtime": 1617462141, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 83932, "section_id": "6945997926376144899", "title": "实战案例:插入函数调用参数", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "实战案例:插入函数调用参数", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 1650, "read_count": 14537, "comment_count": 119, "ctime": 1617515400, "mtime": 1617515400, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 83940, "section_id": "6947682728200372232", "title": "JS Parser 的历史", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "JS Parser 的历史", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 1260, "read_count": 8193, "comment_count": 28, "ctime": 1617634902, "mtime": 1617634902, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 83941, "section_id": "6947689001713139720", "title": "traverse 的 path、scope、visitor", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "traverse 的 path、scope、visitor", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 838, "read_count": 9316, "comment_count": 35, "ctime": 1617645361, "mtime": 1617645361, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 83942, "section_id": "6947678220401508392", "title": "Generator 和 SourceMap 的奥秘", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "Generator 和 SourceMap 的奥秘", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 746, "read_count": 5755, "comment_count": 20, "ctime": 1617645370, "mtime": 1617645370, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 84509, "section_id": "6982846603283398687", "title": "Code- Frame 和代码高亮原理", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "Code- Frame 和代码高亮原理", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 680, "read_count": 3881, "comment_count": 14, "ctime": 1626125928, "mtime": 1626125928, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 83933, "section_id": "6946582521672892456", "title": "Babel 插件和 preset", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "Babel 插件和 preset", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 627, "read_count": 6504, "comment_count": 20, "ctime": 1617557063, "mtime": 1617557063, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 83943, "section_id": "6947733921123532814", "title": "Babel 插件的单元测试", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "Babel 插件的单元测试", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 375, "read_count": 4097, "comment_count": 10, "ctime": 1617645422, "mtime": 1617645422, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 84115, "section_id": "6954550974698651680", "title": "Babel 的内置功能(上)", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "Babel 的内置功能(上)", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 1287, "read_count": 6566, "comment_count": 20, "ctime": 1619303033, "mtime": 1619303033, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 83949, "section_id": "6947175741821812768", "title": "Babel 的内置功能(下)", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "Babel 的内置功能(下)", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 1393, "read_count": 4459, "comment_count": 33, "ctime": 1617645866, "mtime": 1617645866, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 87000, "section_id": "7093335532888915982", "title": "Babel 配置的原理", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "Babel 配置的原理", "markdown_content": "", "markdown_show": "", "is_free": 1, "read_time": 807, "read_count": 780, "comment_count": 3, "ctime": 1651770340, "mtime": 1651770340, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 84420, "section_id": "6978397048307466252", "title": "工具介绍:VSCode Debugger 的使用", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "工具介绍:VSCode Debugger 的使用", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 522, "read_count": 3972, "comment_count": 9, "ctime": 1624784676, "mtime": 1624784676, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 84317, "section_id": "6966211099620278272", "title": "实战案例:自动埋点", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "实战案例:自动埋点", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 810, "read_count": 8530, "comment_count": 35, "ctime": 1621947414, "mtime": 1621947414, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 84059, "section_id": "6951617082454704162", "title": "实战案例: 自动国际化", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "实战案例: 自动国际化", "markdown_content": "", "markdown_show": "", "is_free": 1, "read_time": 1569, "read_count": 5839, "comment_count": 33, "ctime": 1618550655, "mtime": 1618550655, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 84057, "section_id": "6951617020198813733", "title": "实战案例:自动生成 API 文档", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "实战案例:自动生成 API 文档", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 1404, "read_count": 4203, "comment_count": 16, "ctime": 1618550099, "mtime": 1618550099, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 83947, "section_id": "6947733961896362025", "title": "实战案例: Linter", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "实战案例: Linter", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 1623, "read_count": 2969, "comment_count": 13, "ctime": 1617645678, "mtime": 1617645678, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 83946, "section_id": "6947735050972561415", "title": "实战案例: 类型检查", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "实战案例: 类型检查", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 2290, "read_count": 2709, "comment_count": 11, "ctime": 1617645643, "mtime": 1617645643, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 83945, "section_id": "6947734309755158559", "title": "实战案例: 压缩混淆", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "实战案例: 压缩混淆", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 1178, "read_count": 2281, "comment_count": 8, "ctime": 1617645624, "mtime": 1617645624, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 84058, "section_id": "6951616852606844966", "title": "实战案例: JS 解释器", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "实战案例: JS 解释器", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 1744, "read_count": 2872, "comment_count": 13, "ctime": 1618550335, "mtime": 1618550335, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 84315, "section_id": "6965661918937743371", "title": "实战案例: 模块遍历器", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "实战案例: 模块遍历器", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 2499, "read_count": 2285, "comment_count": 6, "ctime": 1621834224, "mtime": 1621834224, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 84314, "section_id": "6965724651297177640", "title": "Babel Macros", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "Babel Macros", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 550, "read_count": 2055, "comment_count": 1, "ctime": 1621834154, "mtime": 1621834154, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 84508, "section_id": "6982591235101818880", "title": "手写 Babel:思路篇", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "手写 Babel:思路篇", "markdown_content": "", "markdown_show": "", "is_free": 1, "read_time": 275, "read_count": 2950, "comment_count": 2, "ctime": 1626125405, "mtime": 1626125405, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 84052, "section_id": "6951616445134405669", "title": "手写 Babel: parser 篇", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "手写 Babel: parser 篇", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 377, "read_count": 2341, "comment_count": 3, "ctime": 1618549372, "mtime": 1618549372, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 84661, "section_id": "6994379397419499523", "title": "手写 Babel: traverse 篇", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "手写 Babel: traverse 篇", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 537, "read_count": 1524, "comment_count": 3, "ctime": 1628844739, "mtime": 1628844739, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 84662, "section_id": "6995151247120531493", "title": "手写 Babel: traverse -- path篇", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "手写 Babel: traverse -- path篇", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 1352, "read_count": 1249, "comment_count": 4, "ctime": 1628844745, "mtime": 1628844745, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 84663, "section_id": "6995460468261257246", "title": "手写 Babel: traverse -- scope篇", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "手写 Babel: traverse -- scope篇", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 713, "read_count": 1058, "comment_count": 4, "ctime": 1628844751, "mtime": 1628844751, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 84664, "section_id": "6994995289954189327", "title": "手写 Babel: generator篇", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "手写 Babel: generator篇", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 1081, "read_count": 1182, "comment_count": 2, "ctime": 1628844756, "mtime": 1628844756, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 84665, "section_id": "6994379397591466017", "title": "手写 Babel: core篇", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "手写 Babel: core篇", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 610, "read_count": 1262, "comment_count": 7, "ctime": 1628844762, "mtime": 1628844762, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 84666, "section_id": "6995834908002222117", "title": "手写 Babel: cli篇", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "手写 Babel: cli篇", "markdown_content": "", "markdown_show": "", "is_free": 1, "read_time": 1095, "read_count": 2193, "comment_count": 4, "ctime": 1628844767, "mtime": 1628844767, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 84667, "section_id": "6995835006530617381", "title": "手写 Babel: 总结", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "手写 Babel: 总结", "markdown_content": "", "markdown_show": "", "is_free": 0, "read_time": 272, "read_count": 1248, "comment_count": 1, "ctime": 1628844773, "mtime": 1628844773, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null }, { "id": 83948, "section_id": "6947682728250736676", "title": "小册总结", "user_id": "2788017216685118", "booklet_id": "6946117847848321055", "status": 1, "content": "", "draft_content": "", "draft_title": "小册总结", "markdown_content": "", "markdown_show": "", "is_free": 1, "read_time": 255, "read_count": 2213, "comment_count": 13, "ctime": 1617645723, "mtime": 1617645723, "is_update": 0, "draft_read_time": 0, "vid": "", "reading_progress": null } ] } }